草庐IT

C++ 运算符 [] 魔法

全部标签

c++ - 递归和预递减运算符

我有这个功能:voidm(intn){if(n>0)m(--n);coutoutputis:001234}我无法理解它的工作原理。例如:n(输入)=5输出:001234我的问题是:为什么两次显示零?当我像这样添加括号时:voidm(intn){if(n>0){m(--n);cout那么,这段代码中的什么括号导致“0”只存在一次?当我将预递减(--n)更改为后递减(n--)时,它什么也没显示。为什么?有人可以帮助我了解它是如何工作的吗? 最佳答案 首先要注意的是:在C++中,如果您不在if之后放置括号声明,只有下一行会出现在声明中。示

c++ - 如果算术运算的结果没有存储在内存中会发生什么

5年前我在学习C++时,我们的作业之一是CreateaprogramthatcalculatesthetemperatureinfahrenheitbasedonthecelsiusinputusingtheformulaC°x9/5+32=F°我们的第一个版本是这样的intmain(){floatcelsius;cout>celsius;cout有同学指出没有明确告诉我们输出结果,导致intmain(){floatcelsius;cout>celsius;celsius*(9.0/5)+32;return0;}我将此作为轶事:在指定要求时始终要彻底最近我一直在想这段代码是否真的满足要

即使类没有定义构造函数,也不能在类上调用 C++ 默认移动赋值运算符

当我熟悉C++14规范时,我读到,如果一个类没有显式声明的复制构造函数、复制赋值运算符、移动构造函数或移动赋值运算符,编译器应该生成默认实现.为线程安全文件考虑这个空类:classThreadSafeFile{std::mutexm_mutex;std::stringm_FileName;std::ofstreamm_File;};当我尝试像这样移动分配它时:ThreadSafeFilefile;ThreadSafeFilefile2=std::move(file);我遇到这个编译错误:function"ThreadSafeFile::ThreadSafeFile(constThrea

c++ - 对返回前仅对 EAX 的低字节进行异或运算的虚方法进行逆向工程

我需要帮助从反汇编中对虚拟方法进行逆向工程。代码最初是用Microsoft的VisualC++编译的。问题方法如下:sub_92D110procnearxoral,alretnsub_92d110endp这个方法在很多类之间被引用,甚至在一个类的虚表中被多次引用。我不确定它的作用;这是否意味着该方法已内联但调用仍然存在以便vtable保持其大小?如果是这样,xoral,al做了什么?我是不是误解了调用约定之类的东西? 最佳答案 这很可能是这样的:boolsomeclass::somemethod(){returnfalse;}说明x

c++ - 运算符重载 C++, (+, -, *,/etc.) 有没有比复制、替换和粘贴更聪明的方法?

我正在编写一种矩阵库,所以我使用运算符重载为矩阵提供了一个operator+。它看起来像这样。friendmatrixoperator+(constmatrix&Input_1,constmatrix&Input_2){matrixOutput;for(inti=0;i据我测试,它是有效的。现在我也想添加-、/、*运算符,它们的工作原理都是一样的。当然我可以使用复制、替换和粘贴。但这不利于可读性和可维护性。有没有更聪明的解决方案,也许还有一个概念,因为我不知道用谷歌搜索它的概念名称?我刚发现如何重载单个运算符。 最佳答案 您可以使用

c++ - C++11 中的逗号运算符(排序)

标准提到f(a,(t=3,t+2),c);根据我的理解,这将是一个赋值表达式,后跟第二个运算符的表达式。但语法列出它并列:表达式:赋值表达式表达式,赋值表达式WorkingDraft,StandardforProgrammingLanguageC++RevisionN4140(November2014)有人好心向我解释一下我在这里缺少什么吗? 最佳答案 当你看到expression:assignment-expressionexpression,assignment-expression表示有2种可能的表达方式。一种可能性是它只是a

c++ - 二维矩阵和重载运算符()/丑陋的语法

我在我的一个项目中使用二维矩阵。这类似于C++FAQLite中的建议.巧妙的是你可以像这样使用它:intmain(){Matrixm(10,10);m(5,8)=106.15;std::cout现在,我有一个由顶点组成的图,每个顶点都有一个公共(public)(只是为了简化示例)指针,指向上面的二维矩阵。现在我确实有一个非常丑陋的语法来访问它。(*sampleVertex.some2DTable)(0,0)=0;//badsampleVertex.some2DTable->operator()(0,0)=0;//evenworse...可能由于我对运算符重载缺乏经验,我在这里遗漏了一些

c++ - 将调用哪个重载版本的运算符

假设我在一个类中声明了下标运算符char&operator[](intindex);constcharoperator[](intindex)const;在什么情况下调用第二次重载。是否仅通过const对象调用。以下场景会调用哪个版本的operator。constcharres1=nonConstObject[10];nonConstObject[10]; 最佳答案 第一个被调用。不要被返回值弄糊涂了;只有参数被认为是选择方法。在这种情况下,隐式this是非常量,因此调用非常量版本。 关

c++ - 在 C++ 中重载 + 运算符时第一个参数是字符串的问题

我有一个自制的字符串类://String.hString&operator=(constString&);String&operator=(char*);constStringoperator+(String&s);constStringoperator+(char*sA);..//inmain:Strings1("hi");Strings2("hello");str2=str1+"ok";//thisisoktodostr2="ok"+str1;//butnotthisway//Shouldn'titautomaticallydetectthatoneargumentisastrin

C++: union 与按位运算符

我有两个char,我想将它们按位“拼接”在一起。例如:charc1=11;//00001011charc2=5;//00000101shortintsi=stitch(c1,c2);//0000101100000101所以,我首先尝试的是按位运算符:shortintstitch(charc1,charc2){return(c1但这不起作用:我得到一个short等于c2...(1)为什么?(但是:c1和c2在我的真实应用中是负数...也许这是问题的一部分?)所以,我的第二个解决方案是使用union:unionstUnion{struct{charc1;charc2;}shortintsi